package service

import (
	"time"
	"todo_list/model"
	serializer "todo_list/serializer"
)

type CreateTaskService struct {
	Title   string `json:"title" form:"title "`
	Content string `json:"content" form:"content"`
	Status  int    `json:"status" form:"status"` // 0是未做，1是已做
}

type ShowTaskService struct {
}

type ListTaskService struct {
	PageNum  int `json:"page_num" form:"page_num"`
	PageSize int `json:"page_size" form:"page_size"`
}

type UpdateTaskService struct {
	Title   string `json:"title" form:"title "`
	Content string `json:"content" form:"content"`
	Status  int    `json:"status" form:"status"` // 0是未做，1是已做
}

type SearchTaskService struct {
	Info     string `json:"info" from:"info"`
	PageNum  int    `json:"page_num" form:"page_num"`
	PageSize int    `json:"page_size" form:"page_size"`
}

type DeleteTaskService struct {
}

// 新增一条备忘录
func (service *CreateTaskService) Create(id uint) serializer.Response {
	var user model.User
	code := 200
	model.DB.First(&user, id)
	task := model.Task{
		User:      user,
		Uid:       user.ID,
		Title:     service.Title,
		Status:    0,
		Content:   service.Content,
		StartTime: time.Now().Unix(),
		EndTime:   0,
	}
	err := model.DB.Create(&task).Error
	if err != nil {
		code = 500
		return serializer.Response{
			Status: code,
			Msg:    "创建备忘录失败",
		}
	}
	return serializer.Response{
		Status: code,
		Msg:    "创建成功",
	}
}

// 展示一条备忘录
func (service *ShowTaskService) Show(tid string) serializer.Response {
	var task model.Task
	code := 200
	err := model.DB.First(&task, tid).Error
	// model.DB.First()从数据库中查询与tid匹配的第一条记录，并将结果赋值给task
	if err != nil {
		code = 500
		return serializer.Response{
			Status: code,
			Msg:    "查询失败",
		}
	}
	return serializer.Response{
		Status: code,
		Data:   serializer.BuildTask(task),
	}
}

// 列表返回用户所有备忘录
func (service *ListTaskService) List(uid uint) serializer.Response {
	var tasks []model.Task
	// 用于存储从数据库中检索到的任务列表
	count := 0
	// 用于存储任务的总数
	if service.PageSize == 0 {
		service.PageSize = 15
	}
	model.DB.Model(&model.Task{}).Preload("User").Where("uid=?", uid).Count(&count).
		Limit(service.PageSize).Offset((service.PageNum - 1) * service.PageSize).Find(&tasks)
	return serializer.BuildListResponse(serializer.BuildTasks(tasks), uint(count))
	/*
	   `model.DB.Model(&model.Task{})`: 设定模型为 `Task`
	   `Preload("User")`: 预加载关联的 `User` 模型，这通常用于避免N+1查询问题
	   `Where("uid=?", uid)`: 过滤条件，只选择 `uid` 字段等于给定 `uid` 的记录
	   `Count(&count)`: 计算匹配记录的总数，并存储在 `count` 变量中
	   `Limit(service.PageSize)`: 限制返回的记录数为 `PageSize`
	   `Offset((service.PageNum - 1) * service.PageSize)`: 跳过前面的记录，以实现分页。例如，如果 `PageNum` 是2，那么它会跳过第一页的所有记录
	   `Find(&tasks)`: 执行查询并将结果存储在 `tasks` 变量中
	*/
}

// 更新备忘录操作
func (service *UpdateTaskService) Update(tid string) serializer.Response {
	var task model.Task
	// model.Task 这可能是一个数据库模型
	model.DB.First(&task, tid)
	// 从数据库中查询与tid匹配的第一个任务，并将其赋值给task变量
	task.Content = service.Content
	task.Title = service.Title
	task.Status = service.Status
	model.DB.Save(&task)
	// err := model.DB.Save(&task).Error
	// 使用model.DB的Save方法保存或更新task对象。这意味着，如果task对象之前不存在于数据库中，它将被创建；如果它已存在，它的内容将被更新
	return serializer.Response{
		Status: 200,
		Data:   serializer.BuildTask(task),
		// Data字段是调用serializer.BuildTask(task)的结果，这可能是一个用于序列化的函数，将task对象转换为某种更易于传输或显示的格式
		Msg: "更新完成",
	}
}

// 查询备忘录操作
func (service *SearchTaskService) Search(uid uint) serializer.Response {
	var tasks []model.Task
	count := 0
	if service.PageSize == 0 {
		service.PageSize = 10
	}
	model.DB.Model(&model.Task{}).Preload("User").Where("uid=?", uid).
		Where("title LIKE ? OR content LIKE ?", "%"+service.Info+"%", "%"+service.Info+"%").
		Count(&count).Limit(service.PageSize).Offset((service.PageNum - 1) * service.PageSize).Find(&tasks)
	// 第一行找到用户  // 二模糊查询  // 计数分页操作
	return serializer.BuildListResponse(serializer.BuildTasks(tasks), uint(count))
}

// 删除备忘录
func (service *DeleteTaskService) Delete(tid string) serializer.Response {
	var task model.Task
	err := model.DB.Delete(&task, tid).Error
	if err != nil {
		return serializer.Response{
			Status: 500,
			Msg:    "删除失败",
		}
	}
	return serializer.Response{
		Status: 200,
		Msg:    "删除成功",
	}
}
